【精选】Matlab 您所在的位置:网站首页 matlab cos函数怎么写 【精选】Matlab

【精选】Matlab

#【精选】Matlab| 来源: 网络整理| 查看: 265

1 Fcn模块

Fcn 模块将指定的数学表达式应用于其输入

 

2 MATLAB Function模块

使用 MATLAB Function 模块可以编写用于 Simulink® 模型的 MATLAB® 函数。

双击MATLAB Function模块可以进行函数编辑。

 

3 S-Function模块

可以通过编写M文件供S-Function调用;点击edit可以打开函数文件

通过输入edit sfuntmpl可以打开sfuntion的编辑模板。

S-function内部函数介绍 [sys,x0,str,ts] = functionName(t,x,u,flag) 这是函数的总入口,收到信号后,首先进入这个函数.这个函数包含一个switch语句,根据情况进入不同的子函数[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes; S-function进行基本的设置,具体参数会在后面进行介绍。相当于构造函数sys=mdlDerivatives(t,x,u); 该函数仅在连续系统中被调用,用于产生控制系统状态的导数sys=mdlUpdate(t,x,u); 离散模块状态更新,该函数仅在离散系统中被调用,用于产生控制系统的下一个状态sys=mdlOutputs(t,x,u); 连续模块状态更新,产生(传递)系统输出sys=mdlGetTimeOfNextVarHit(t,x,u) 获得下一次系统执行(next hit)的时间,该时间为绝对时间 此函数仅在采样时间数组中指定变量离散时间采样时间[-2 0]时会被调用。sys=mdlTerminate(t,x,u) 相当于构析函数,结束该仿真模块时被调用

S-function的执行顺序 在仿真开始时,执行mdlInitializeSizes若系统包含连续部分,则调用mdlDerivatives;若系统包含离散部分,则调用mdlUpdate调用mdlOutputs,产生输出若满足条件,则执行mdlGetTimeOfNextVarHit循环执行1--3,直至仿真停止执行mdlTerminate,仿真停止

S-function输入输出参数含义

输入参数t,x,u,flag:

t :系统时间,代表当前的仿真时间x :系统状态,行向量,格式为x(1),x(2)u : 系统输入向量,即在simulink models中连接至S-function的线上的数据。注意区分x和uflag : 系统状态,由系统自动生成,决定了系统应当执行哪个S-function子函数

输出参数sys,x0,str,ts,simStateCompliance:

sys : 系统本身,可以理解为下一时刻的系统;同时sys的前几个数值(sys[1]等)是系统的输出,即在simulink中S-function伸出线上的数据x0 : 系统初始状态,格式为x0=[0;0;0].str : 状态排序字符串,通常指定为[],无具体含义。ts : 可认为是采样时间,表示模块采样时间和偏差的矩阵,[period,offfset],当ts=-1时表示iyu输入信号同采样周期。simStateCompliance

 

 运行结果:

test_ljs.m:

%函数的总入口,收到信号后,首先进入这个函数.这个函数包含一个switch语句,根据情况进入不同的子函数 function [sys,x0,str,ts] = spacemodel(t,x,u,flag) switch flag, case 0, [sys,x0,str,ts]=mdlInitializeSizes; case 1, sys=mdlDerivatives(t,x,u); case 2, sys=mdlUpdate(t,x,u); case 3, sys=mdlOutputs(t,x,u); case 4, sys=mdlGetTimeOfNextVarHit(t,x,u); case 9, sys=mdlTerminate(t,x,u); otherwise DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end %S-function进行基本的设置,相当于构造函数,定义S函数的基本特性,包括采样时间、连续或者离散状态的初始条件和Sizes数组 function [sys,x0,str,ts]=mdlInitializeSizes sizes = simsizes; %调用构造函数,生成一个默认类 sizes.NumContStates = 2; %设置系统连续状态的数量,如果是2个输出,则设为2 sizes.NumDiscStates = 0; %设置系统离散状态的数量 sizes.NumOutputs = 2; %设置系统输出的数量,如果是2个输出,则设为2 sizes.NumInputs = 1; %设置系统输入的数量 sizes.DirFeedthrough = 1; %设置系统直接通过量的数量,一般为1 sizes.NumSampleTimes = 1; % At least one sample time is needed % 采样时间个数,1表示只有一个采样周期. % 猜测为如果为n,则下一时刻的状态需要知道前n个状态的系统状态 sys = simsizes(sizes); %将sizes结构体中的信息传递给sys x0 = [0 1]; % 系统初始状态 str = []; % 保留变量,保持为空 ts = [0 0]; % 采样时间 %该函数仅在连续系统中被调用,计算连续状态变量的微分方程,求所给表达式的等号左边状态变量的积分值的过程 function sys=mdlDerivatives(t,x,u) %Time-varying model sys(1)=u*1; sys(2)=u*2; %产生(传递)系统输出 function sys=mdlOutputs(t,x,u) % sys(1)=x(1); % sys(2)=x(2); if u=-0.5 && u 0.5 sys(1)=1; sys(2)=2; end %此外,还有三类函数如下 %sys=mdlUpdate(t,x,u); 该函数仅在离散系统中被调用,用于产生控制系统的下一个状态;更新离散状态、采样时间和主时间步的要求 function sys=mdlUpdate(t,x,u) sys =[]; % sys=mdlGetTimeOfNextVarHit(t,x,u) 获得下一次系统执行(next hit)的时间,该时间为绝对时间 此函数仅在采样时间数组中指定变量离散时间采样时间[-2 0]时会被调用。 function sys=mdlGetTimeOfNextVarHit(t,x,u) sampleTime = 1; %设置下一个采样时间在1s之后 sys = t + sampleTime; % sys=mdlTerminate(t,x,u) 相当于构析函数,结束该仿真模块时被调用 function sys=mdlTerminate(t,x,u) sys = [];

例1:用S函数实现Gain模块 ,通过建立 Mask传递参数Gain_fac 建立模型

 Mask封装s-function:

 封装效果:

 S-function设置:

将Mask中的参数产地到function中

 代码实现:

注意主函数和mdlOutputs函数多了一个Gain_fac参数传递作为Gan的系数

%函数的总入口,收到信号后,首先进入这个函数.这个函数包含一个switch语句,根据情况进入不同的子函数 function [sys,x0,str,ts] = Gain_sfun_test(t,x,u,flag,Gain_fac) switch flag, case 0, %第一步:设置初始条件 [sys,x0,str,ts]=mdlInitializeSizes; case 1,%更新输出前,计算导数 sys=mdlDerivatives(t,x,u); case 2,,%第四步:更新离散状态 sys=mdlUpdate(t,x,u); case 3,%第三步:计算输出;第五步:计算输出 sys=mdlOutputs(t,x,u,Gain_fac); case 4,%第二步:计算下一个采样时间,适应与变采样时间 sys=mdlGetTimeOfNextVarHit(t,x,u); case 9,%结束仿真 sys=mdlTerminate(t,x,u); otherwise DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end %S-function进行基本的设置,相当于构造函数,定义S函数的基本特性,包括采样时间、连续或者离散状态的初始条件和Sizes数组 function [sys,x0,str,ts]=mdlInitializeSizes sizes = simsizes; %调用构造函数,生成一个默认类 sizes.NumContStates = 0; %设置系统连续状态的数量,如果是2个输出,则设为2 sizes.NumDiscStates = 0; %设置系统离散状态的数量 sizes.NumOutputs = 1; %设置系统输出的数量,如果是2个输出,则设为2 sizes.NumInputs = 1; %设置系统输入的数量 sizes.DirFeedthrough = 1; %设置系统直接通过量的数量,一般为1 sizes.NumSampleTimes = 0; % At least one sample time is needed % 采样时间个数,1表示只有一个采样周期. % 猜测为如果为n,则下一时刻的状态需要知道前n个状态的系统状态 sys = simsizes(sizes); %将sizes结构体中的信息传递给sys x0 = []; % 系统初始状态 str = []; % 保留变量,保持为空 ts = []; % 采样时间 %该函数仅在连续系统中被调用,计算连续状态变量的微分方程,求所给表达式的等号左边状态变量的积分值的过程 function sys=mdlDerivatives(t,x,u) %Time-varying model % sys(1)=u*1; % sys(2)=u*2; sys=[]; %产生(传递)系统输出 function sys=mdlOutputs(t,x,u,Gain_fac) sys(1)=Gain_fac*u; % sys(2)=x(2); %此外,还有三类函数如下 %sys=mdlUpdate(t,x,u); 该函数仅在离散系统中被调用,用于产生控制系统的下一个状态;更新离散状态、采样时间和主时间步的要求 function sys=mdlUpdate(t,x,u) sys =[]; % sys=mdlGetTimeOfNextVarHit(t,x,u) 获得下一次系统执行(next hit)的时间,该时间为绝对时间 此函数仅在采样时间数组中指定变量离散时间采样时间[-2 0]时会被调用。 function sys=mdlGetTimeOfNextVarHit(t,x,u) sampleTime = 1; %设置下一个采样时间在1s之后 sys = t + sampleTime; % sys=mdlTerminate(t,x,u) 相当于构析函数,结束该仿真模块时被调用 function sys=mdlTerminate(t,x,u) sys = [];  运行结果:

例2:用S函数实现积分模块  建立模型

S-Function代码: %函数的总入口,收到信号后,首先进入这个函数.这个函数包含一个switch语句,根据情况进入不同的子函数 function [sys,x0,str,ts] = Gain_sfun_test(t,x,u,flag) switch flag, case 0, %第一步:设置初始条件 [sys,x0,str,ts]=mdlInitializeSizes; case 1,%更新输出前,计算导数 sys=mdlDerivatives(t,x,u); case 2,,%第四步:更新离散状态 sys=mdlUpdate(t,x,u); case 3,%第三步:计算输出;第五步:计算输出 sys=mdlOutputs(t,x,u); case 4,%第二步:计算下一个采样时间,适应与变采样时间 sys=mdlGetTimeOfNextVarHit(t,x,u); case 9,%结束仿真 sys=mdlTerminate(t,x,u); otherwise DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end %S-function进行基本的设置,相当于构造函数,定义S函数的基本特性,包括采样时间、连续或者离散状态的初始条件和Sizes数组 function [sys,x0,str,ts]=mdlInitializeSizes sizes = simsizes; %调用构造函数,生成一个默认类 sizes.NumContStates = 1; %设置系统连续状态的数量,如果是2个输出,则设为2 sizes.NumDiscStates = 0; %设置系统离散状态的数量 sizes.NumOutputs = 1; %设置系统输出的数量,如果是2个输出,则设为2 sizes.NumInputs = 1; %设置系统输入的数量 sizes.DirFeedthrough = 1; %设置系统直接通过量的数量,一般为1 sizes.NumSampleTimes = 0; % At least one sample time is needed % 采样时间个数,1表示只有一个采样周期. % 猜测为如果为n,则下一时刻的状态需要知道前n个状态的系统状态 sys = simsizes(sizes); %将sizes结构体中的信息传递给sys x0 = [0]; % 系统初始状态 str = []; % 保留变量,保持为空 ts = []; % 采样时间 %该函数仅在连续系统中被调用,计算连续状态变量的微分方程,求所给表达式的等号左边状态变量的积分值的过程 function sys=mdlDerivatives(t,x,u) %Time-varying model % sys(1)=u*1; % sys(2)=u*2; sys=3*u;%求积分 %产生(传递)系统输出 function sys=mdlOutputs(t,x,u) sys(1)=2*x;%产生输出 % sys(2)=x(2); %此外,还有三类函数如下 %sys=mdlUpdate(t,x,u); 该函数仅在离散系统中被调用,用于产生控制系统的下一个状态;更新离散状态、采样时间和主时间步的要求 function sys=mdlUpdate(t,x,u) sys =[]; % sys=mdlGetTimeOfNextVarHit(t,x,u) 获得下一次系统执行(next hit)的时间,该时间为绝对时间 此函数仅在采样时间数组中指定变量离散时间采样时间[-2 0]时会被调用。 function sys=mdlGetTimeOfNextVarHit(t,x,u) sampleTime = 1; %设置下一个采样时间在1s之后 sys = t + sampleTime; % sys=mdlTerminate(t,x,u) 相当于构析函数,结束该仿真模块时被调用 function sys=mdlTerminate(t,x,u) sys = [];  运行结果:

参考材料《MATLAB_SIMULINK系统仿真》



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有